package fiuba.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import fiuba.model.BaseObject;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.Column;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Transient;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;


@Entity
public class Seccion extends BaseObject implements Serializable {
	
    private static final long serialVersionUID = 332626162173359411L;
    private Long id;
	private String nombre;
	private Boolean publicada;
	private Set<Role> roles = new HashSet<Role>();
	private Menu menu;
	private Estructura estructura;
	private ListaNoticias listaNoticias;
    private boolean mostrarContenidoPropio;
    
    @Column
	public boolean isMostrarContenidoPropio() {
		return mostrarContenidoPropio;
	}
	
	public void setMostrarContenidoPropio(boolean mostrarContenidoPropio) {
		this.mostrarContenidoPropio = mostrarContenidoPropio;
	}
	@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE} ) 
	public ListaNoticias getListaNoticias() {
		return listaNoticias;
	}
	public void setListaNoticias(ListaNoticias listaNoticias) {
		this.listaNoticias = listaNoticias;
	}
	@Id @GeneratedValue(strategy=GenerationType.AUTO)
	public Long getId() {
		return id;
	}
	@Column(nullable=false,length=50,unique=true)
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	@Column
	public Boolean getPublicada() {
		return publicada;
	}
	public void setPublicada(Boolean publicada) {
		this.publicada = publicada;
	}
	
	@ManyToMany(fetch = FetchType.EAGER) 
    @JoinTable(
            name="seccion_role",
            joinColumns = { @JoinColumn( name="seccion_id") },
            inverseJoinColumns = @JoinColumn( name="role_id")
    )    
    public Set<Role> getRoles() {
        return roles;
    }
	 /**
     * Adds a role for the seccion
     * @param role the fully instantiated role
     */
    public void addRole(Role role) {
        getRoles().add(role);
    }

    /**
     * Convert user roles to LabelValue objects for convenience.
     * @return a list of LabelValue objects with role information
     */
    @Transient
    public List<LabelValue> getRoleList() {
        List<LabelValue> userRoles = new ArrayList<LabelValue>();

        if (this.roles != null) {
            for (Role role : roles) {
                // convert the user's roles to LabelValue Objects
                userRoles.add(new LabelValue(role.getName(), role.getName()));
            }
        }
        return userRoles;
    }
    
	public boolean equals (Object o){
		if (this == o) {
            return true;
        }
        if (!(o instanceof Seccion)) {
            return false;
        }
        final Seccion seccion = (Seccion) o;
        if (seccion != null && nombre.equals(seccion.getNombre())) {
        	return true;
        }else {
        	return false;
        }
	}
	
	public int hashCode() {
        return (nombre != null ? nombre.hashCode() : 0);
    }
	
	public String toString() {
        ToStringBuilder sb = new ToStringBuilder(this, ToStringStyle.DEFAULT_STYLE)
                .append("Nombre: ", this.nombre)
                .append("Publicada", this.publicada);
        return sb.toString();
	}
	
	@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE} ) 
    public Menu getMenu() {
		return menu;
	}	
	public void setMenu(Menu menu) {
		this.menu = menu;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public void setRoles(Set<Role> roles) {
		this.roles = roles;
	}
	
	@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE} ) 
	public Estructura getEstructura() {
		return estructura;
	}
	public void setEstructura(Estructura estructura) {
		this.estructura = estructura;
	}
	
}
